﻿Imports System.Collections.Generic
Imports Pop.Api.Response
Imports Pop.Api.Util
Namespace Pop.Api.Request
    ''' <summary>
    ''' 1.01 (初级)发布商品接口
    ''' </summary>
    Public Class AddItemRequest
        Inherits PopRequest(Of AddItemResponse)
        'Implements ITopRequest(Of AddItemResponse)

        ''' <summary>
        ''' 卖家QQ号
        ''' </summary>
        Public Property SellerUin As Nullable(Of Long)

        ''' <summary>
        ''' 商品名称1-60字节
        ''' </summary>
        Property ItemName As String

        ''' <summary>
        ''' 出售类型“ST_FIXED”，一口价（默认）
        ''' </summary>
        Public Property SellType As String

        ''' <summary>
        ''' 城市id
        ''' </summary>
        Property CityId As Nullable(Of Long)

        ''' <summary>
        ''' 省份id
        ''' </summary>
        Property ProvinceId As Nullable(Of Long)

        ''' <summary>
        ''' 国家id
        ''' </summary>
        Property CountryId As Nullable(Of Long)

        ''' <summary>
        ''' 商品的属性串编码
        ''' 按照class config属性串格式拼写
        ''' 属性工具:
        ''' http://pop.paipai.com/resources/attribute_tool.html
        ''' </summary>
        Property Attr As String

        ''' <summary>
        ''' 商品的商家自定义属性
        ''' 该字段暂时不用
        ''' </summary>
        Private Property CustomAttr As String

        ''' <summary>
        ''' 商品所属的店铺分类id，多个分类可用半角逗号隔开。
        ''' </summary>
        Property CategoryId As String

        ''' <summary>
        ''' 商品所属的拍拍类目id。每个商品只能从属于一个拍拍类目id，且必须从属于一个类目id。
        ''' </summary>
        Property ClassId As Nullable(Of Long)

        ''' <summary>
        ''' 商品详情页面主题
        ''' “THEME_DEFAULT”：默认风格。
        ''' “THEME_PURPLE”：紫色浪漫。暂不支持
        ''' “THEME_BLUE”：蓝色幻想。暂不支持
        ''' “THEME_PINK”：粉色回忆。
        ''' “THEME_NATURE”：自然印象。
        ''' “THEME_METAL”：金属狂潮。
        ''' </summary>
        Property Theme As String

        ''' <summary>
        ''' 单位为秒，表示商品第一次发布上架开始计算，过多久会被系统自动下架
        ''' 7天传值: 604800
        ''' 14天传值: 1209600
        ''' 其他数值会通不过校验。
        ''' 发布时，系统自动叠加-600到0之间一个随机值，所以查询时该值不会恰好是调用接口填写的值
        ''' </summary>
        Property ValidDuration As Nullable(Of Long)

        ''' <summary>
        ''' 是否设置商品下架后自动上架。
        ''' 0：不自动上架（默认）
        ''' 1：自动上架
        ''' </summary>
        Property AutoReload As Nullable(Of Long)

        ''' <summary>
        ''' 商品期望状态
        ''' “IS_FOR_SALE”：上架销售。
        ''' “IS_IN_STORE”：放入仓库。
        ''' “IS_SALE_ON_TIME”：定时上架
        ''' </summary>
        Property ItemState As String

        ''' <summary>
        ''' 定时上架时间，格式为 yyyy-MM-dd HH:mm:ss
        ''' 当itemState=IS_SALE_ON_TIME时必填,
        ''' 与validDuration一样也会进行叠加-600秒内的随机偏移
        ''' </summary>
        Property SaleTime As String

        ''' <summary>
        ''' 购买限制，默认为0，表示不限制
        ''' 大于0的值表示单个买家购买该商品不得超过该数目。
        ''' </summary>
        Property BuyLimit As Nullable(Of Long)

        ''' <summary>
        ''' 商品详情描述内容，最大长度为 60k，
        ''' 这里会包含css，html等标签。
        ''' </summary>
        Property DetailInfo As String

        ''' <summary>
        ''' 是否卖家承担运费。
        ''' 0：表示买家承担运费（默认）
        ''' 1：表示卖家承担运费
        ''' </summary>
        Property SellerPayFreight As Nullable(Of Long)

        ''' <summary>
        ''' 运费模板编号。值范围为 10-255，如果为0的话表示没有设置运费模板。
        ''' 当采用freightId运费模板时, 无需再提供expressPrice/mailPrice/emsPrice,
        ''' 此时以运费模板中定义的运费价格为主。
        ''' </summary>
        Property FreightId As Nullable(Of Long)

        ''' <summary>
        ''' 运费模板编号。值范围为 10-255，如果为0的话表示没有设置运费模板。
        ''' 当采用freightId运费模板时, 无需再提供expressPrice/mailPrice/emsPrice,
        ''' 此时以运费模板中定义的运费价格为主。
        ''' </summary>
        Property CodId As Nullable(Of Long)

        ''' <summary>
        ''' 商品的发货方式
        ''' PT_MONEY=款到发货
        ''' PT_BAOBEI=见宝贝描述
        ''' PT_COD=货到付款
        ''' </summary>
        Property SendType As String

        ''' <summary>
        ''' 平邮价格，当不采用运费模版时,需要提供这个运费价格。
        ''' </summary>
        Property MailPrice As Nullable(Of Long)

        ''' <summary>
        ''' 快递价格，当不采用运费模版时,需要提供这个运费价格。
        ''' </summary>
        Property ExpressPrice As Nullable(Of Long)

        ''' <summary>
        ''' EMS运费，0到10000，单位:分
        ''' </summary>
        Property EmsPrice As Nullable(Of Long)

        ''' <summary>
        ''' 商品对应的拍拍产品编码，32 Bytes编码。
        ''' </summary>
        Property ProductCode As String

        ''' <summary>
        ''' 合作商家的私有商品编码，
        ''' 由商家保证该编码在其所有商品中的唯一性，
        ''' 不超过40 Bytes。
        ''' 商家可根据此编码修改商品数据，或进行查询和修改操作，API不提供对该字段的修改。
        ''' 支持的字符范围是：A-Z,a-z,0-9,_ / - 
        ''' </summary>
        Property ItemLocalCode As String

        ''' <summary>
        ''' 是否二手商品。
        ''' 0：表示非二手商品，是全新商品
        ''' 1：表示是二手商品
        ''' 8：商品新旧类型-见商品说明
        ''' </summary>
        Property SecondHandItem As Nullable(Of Long)

        ''' <summary>
        ''' 是否保修商品。
        ''' 0：表示非保修商品
        ''' 1：表示保修商品
        ''' </summary>
        Property WarrantyItem As Nullable(Of Long)

        ''' <summary>
        ''' 是否提供发票。
        ''' 0：表示商品不开具发票
        ''' 1：表示商品可开具发票
        ''' </summary>
        Property InvoiceItem As Nullable(Of Long)

        ''' <summary>
        ''' 是否假一赔三诚信保证商品。
        ''' 0：表示非假一赔三商品
        ''' 1：表示是假一赔三商品
        ''' </summary>
        Property GuaranteeCompensation As Nullable(Of Long)

        ''' <summary>
        ''' 是否7天包退诚信保证商品。
        ''' 0：表示非7天包退诚信保证商品
        ''' 1：表示是7天包退诚信保证商品
        ''' </summary>
        Property Guarantee7Days As Nullable(Of Long)

        ''' <summary>
        ''' 是否14天先行赔付诚信保证商品。
        ''' 0：表示非14天先行赔付诚信保证商品
        ''' 1：表示是14天先行赔付诚信保证商品
        ''' </summary>
        Property Guarantee14Days As Nullable(Of Long)

        ''' <summary>
        ''' 商品的市场参考价格，只对QQ会员特权卖家有效。
        ''' 注意该字段必须大于商品售价，否则发布失败
        ''' </summary>
        Property MarketPrice As Nullable(Of Long)

        ''' <summary>
        ''' 是否橱窗商品。
        ''' 0：表示非橱窗展示商品
        ''' 1：表示是橱窗展示商品
        ''' </summary>
        Property WindowItem As Nullable(Of Long)

        ''' <summary>
        ''' 商品库存(支持出现多次!)
        ''' 字段格式: "17900,100,颜色:白色|尺码:L,AFC0021,备注内容"
        ''' 多个字段 请使用;连接(半角分号)
        ''' </summary>
        Property StockInfo As String

        ''' <summary>
        ''' 尺码表Id。
        ''' </summary>
        Property SizeTableId As Nullable(Of Long)

        ''' <summary>
        ''' 推荐搭配商品编码(商品必须是已经上架的)，多个以‘|’号隔开
        ''' </summary>
        Property RelatedItems As String

        ''' <summary>
        ''' 是否为女装商品
        ''' </summary>
        Property WomanItem As Nullable(Of Long)

        ''' <summary>
        ''' 是否为虚拟商品
        ''' </summary>
        Property VirtualItem As Nullable(Of Long)

        ''' <summary>
        ''' 是否7天免邮包退：1=是、0=否
        ''' </summary>
        Property FreeReturn As Nullable(Of Long)

        ''' <summary>
        ''' 是否快速发货：1=是、0=否
        ''' </summary>
        Property Quick As Nullable(Of Long)

#Region "Overrides"

        Protected Overrides Function GetApiName() As String
            Return "item.addItem"
        End Function

        Protected Overrides Function GetParameters() As IEnumerable(Of KeyValuePair(Of String, String))
            Dim parameters As New PopDictionary
            parameters.Add("sellerUin", Me.SellerUin.ToString)
            parameters.Add("itemName", Me.ItemName)
            parameters.Add("sellType", Me.SellType)
            parameters.Add("cityId", Me.CityId.ToString)
            parameters.Add("provinceId", Me.ProvinceId.ToString)
            parameters.Add("countryId", Me.CountryId.ToString)
            parameters.Add("attr", Me.Attr)
            parameters.Add("customAttr", Me.CustomAttr)
            parameters.Add("categoryId", Me.CategoryId)
            parameters.Add("classId", Me.ClassId.ToString)
            parameters.Add("theme", Me.Theme)
            parameters.Add("validDuration", Me.ValidDuration.ToString)
            parameters.Add("autoReload", Me.AutoReload.ToString)
            parameters.Add("itemState", Me.ItemState)
            parameters.Add("saleTime", Me.SaleTime)
            parameters.Add("buyLimit", Me.BuyLimit.ToString)
            parameters.Add("detailInfo", Me.DetailInfo)
            parameters.Add("sellerPayFreight", Me.SellerPayFreight)
            parameters.Add("freightId", Me.FreightId.ToString)
            parameters.Add("codId", Me.CodId.ToString)
            parameters.Add("mailPrice", Me.MailPrice.ToString)
            parameters.Add("expressPrice", Me.ExpressPrice.ToString)
            parameters.Add("emsPrice", Me.EmsPrice.ToString)
            parameters.Add("productCode", Me.ProductCode)
            parameters.Add("itemLocalCode", Me.ItemLocalCode)
            parameters.Add("secondHandItem", Me.SecondHandItem.ToString)
            parameters.Add("warrantyItem", Me.WarrantyItem.ToString)
            parameters.Add("invoiceItem", Me.InvoiceItem.ToString)
            parameters.Add("guaranteeCompensation", Me.GuaranteeCompensation.ToString)
            parameters.Add("guarantee7Days", Me.Guarantee7Days.ToString)
            parameters.Add("guarantee14Days", Me.Guarantee14Days.ToString)
            parameters.Add("marketPrice", Me.MarketPrice.ToString)
            parameters.Add("windowItem", Me.WindowItem.ToString)
            parameters.Add("stockInfo", Me.StockInfo)
            If Me.StockInfo IsNot Nothing AndAlso Not String.IsNullOrEmpty(Me.StockInfo) Then
                For Each stock In Me.StockInfo.Split({";"c}, StringSplitOptions.RemoveEmptyEntries)
                    parameters.Add("stockInfo", stock)
                Next
            End If
            parameters.Add("sizeTableId", Me.SizeTableId.ToString)
            parameters.Add("relatedItems", Me.RelatedItems)
            parameters.Add("womanItem", Me.WomanItem)
            parameters.Add("virtualItem", Me.VirtualItem)
            parameters.Add("freeReturn", Me.FreeReturn.ToString)
            parameters.Add("quick", Me.Quick.ToString)
            Return parameters
        End Function

        Protected Overrides Sub Validate()
            Me.SellerUin.ValidateRequired("sellerUin")
            Me.ItemName.ValidateMaxLength("itemName", 60)
            Me.ClassId.ValidateRequired("classId")
            Me.ValidDuration.ValidateRequired("validDuration")
            Me.ItemState.ValidateRequired("itemState")
            Me.DetailInfo.ValidateRequired("detailInfo")
            Me.DetailInfo.ValidateMaxLength("detailInfo", 60 * 1024)
            Me.FreightId.ValidateRequired("freightId")
        End Sub

#End Region

    End Class
End Namespace